import axios from 'axios'
import Qs from 'qs'
// eslint-disable-next-line
import Api from './api'
import common from './common'

axios.defaults.retry = 360 // 重试次数，持续半小时
axios.defaults.retryDelay = 5000 // 重试延时，5秒重试一次
// eslint-disable-next-line
axios.defaults.shouldRetry = (error) => true // 重试条件，默认只要是错误都需要重试

axios.defaults.withCredentials = true
axios.defaults.baseURL = Api.domain

/* 普通请求 */
const config = {
  // baseURL: Api.domain,
  timeout: 10000,
  // `withCredentails`选项表明了是否是跨域请求,是否携带cookies
  // withCredentials: true,
  headers: {'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest'},
  transformRequest: [function (data) {
    // 这里可以在发送请求之前对请求数据做处理，比如form-data格式化等，这里可以使用开头引入的Qs（这个模块在安装axios的时候就已经安装了，不需要另外安装）
    data = Qs.stringify(data, { arrayFormat: 'repeat' })
    return data
  }],
  // 返回数据类型
  responseType: 'json'
}
const AxiosInst = axios.create(config)
AxiosInst.interceptors.response.use(undefined, function (err) {
  var config = err.config

  // 判断是否配置了重试
  if (!config || !config.retry) return Promise.reject(err)
  if (!config.shouldRetry || typeof config.shouldRetry !== 'function') return Promise.reject(err)

  // 判断是否满足重试条件
  if (!config.shouldRetry(err)) return Promise.reject(err)

  // 设置重试次数，默认为0
  config.__retryCount = config.__retryCount || 0
  console.log('retrycount:' + config.__retryCount)
  // 判断是否超过了重试次数
  if (config.__retryCount >= config.retry) return Promise.reject(err)

  // 重试次数自增
  config.__retryCount += 1

  common.errTips(-1, err.message)

  // 延时处理
  var backoff = new Promise(function (resolve) {
    setTimeout(function () {
      resolve()
    }, config.retryDelay || 1)
  })
  config.data = Qs.parse(config.data)
  // 重新发起axios请求
  return backoff.then(() => {
    return AxiosInst(config)
  })
})

/* 文件上传请求 */
const fileConfig = {
  // baseURL: Api.domain,
  method: 'post',
  timeout: 20000,
  headers: {'Content-Type': 'multipart/form-data'}
}
const AxiosFile = axios.create(fileConfig)
AxiosFile.interceptors.response.use(undefined, function (err) {
  var config = err.config

  // 判断是否配置了重试
  if (!config || !config.retry) return Promise.reject(err)
  if (!config.shouldRetry || typeof config.shouldRetry !== 'function') return Promise.reject(err)

  // 判断是否满足重试条件
  if (!config.shouldRetry(err)) return Promise.reject(err)

  // 设置重试次数，默认为0
  config.__retryCount = config.__retryCount || 0
  console.log('retrycount:' + config.__retryCount)
  // 判断是否超过了重试次数
  if (config.__retryCount >= config.retry) return Promise.reject(err)

  // 重试次数自增
  config.__retryCount += 1

  common.errTips(-1, err.message)

  // 延时处理
  var backoff = new Promise(function (resolve) {
    setTimeout(function () {
      resolve()
    }, config.retryDelay || 1)
  })

  // 重新发起axios请求
  return backoff.then(() => {
    return AxiosFile(config)
  })
})

export { AxiosInst, AxiosFile }
